package designmode.decorator;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;

/**
 * 创建时间：2018年04月18日10:12 <br>
 * 作者：fuchaoyang <br>
 * 描述：测试装饰者模式
 */

public class TestDecoratorMode {
  public static void main(String[] args) {
    // 装饰者的好处，我们可以将这些功能自由组合
    GuoDi guoDi = new Jinzhengu(new NiuRou(new YuanyangGuo()));
    System.out.println("guoDi.cost() = " + guoDi.cost());
    System.out.println("guoDi.name() = " + guoDi.name());

    try {
      // java中最典型的 装饰者模式
      GZIPInputStream inputStream =
          new GZIPInputStream(new BufferedInputStream(new FileInputStream("")));
    } catch (IOException e) {
      e.printStackTrace();
    }
    // andriod 中最典型的 装饰者模式：
    /*abstract class Context是抽象类就是装饰者模式的Component：组件对象接口。
    而真正的实现是在ContextImpl中完成，它继承自Context抽象类并实现抽象方法。
    是ConcreteComponent：具体的组件对象，实现组件对象接口，就是被装饰的原始对象。
    而Decorator所有装饰器的抽象父类是ContextWrapper。从代码上看是完全和装饰者模式一样的实现。
    内部持有一个Component对象，就是持有一个被装饰的对象。*/

  }
}
